#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100 //存储空间初始分配量 
#define STACKINCREMENT 10   //存储空间分配增量 
#define ERROR -1
#define OK 1

typedef struct {
	int *base;  //在栈构造之前和销毁之后，base的值为NULL 
	int *top;   //栈顶指针 
	int stacksize; //当前已分配的存储空间，以元素为单位 
}SqStack;

/*
*初始栈 
*/ 
int InitStack(SqStack s){
	//构造一个空栈s
	s.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
	if(!s.base) return ERROR;
	s.top = s.base; //令头指针和尾指针同时指向栈底
	s.stacksize =  STACK_INIT_SIZE;
	return OK;
}
int Push(SqStack s,int e){
	
	//插入元素e为新的栈顶元素
	if(s.top-s.base >= s.stacksize){ //栈满，追加存储空间
		s.base = (int *)realloc(s.base,(s.stacksize + STACKINCREMENT) * sizeof(int)); //realloc是在现有的空间基础之上在追加存储空间长度
		if(!s.base) return ERROR;
		s.top = s.base + s.stacksize;
		s.stacksize +=  STACKINCREMENT;	
	}
	*s.top++ = e; //元素入栈之后 栈顶指针向上移一位 
	return OK;
}
int Pop(SqStack s,int *e){
	//若栈不空，则删除s的栈顶元素，用e返回其值，并返回OK;否则返回ERROR
	if(s.top == s.base) return ERROR;
	*e = * --s.top;
	return OK; 
} 
int main() {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
	int *e = 0;
	SqStack s;
	InitStack(s);
	Push(s,10);	
	Pop(s,e);	
	printf("%d",*e);
}